(function(factory) {
	if (typeof define === "function" && define.amd) {
		// AMD. Register as an anonymous module.
		define(factory);
	} else {
		// Browser globals
		factory();
	}
}(function() {
	/**
	 * HteOS框架中事件总线，使用该组件进行组件之间的解耦，在这个组件中可以绑定全局事件
	 * 其他组件触发事件之后又该组件负责组装调度绑定的函数执行，如HteOS.Metro组件中监听如果应用实例化完成之后进行桌面渲染
	 * 
	 * 	HteOS.EventManager.on("hte.apps.initialized",function(){
	 *			metro.render();
	 *		});
	 * 
	 * <p>注意：由于文档生成器的原因，现在文档中所有的事件使用“-”来代替“.”，在实际代码中要替换回来
	 *     hte-apps-initialized ---> hte.apps.initialized
	 * </p>
	 * 
	 * @class HteOS.EventManager
	 * @singleton
	 * **/
	HteOS.EventManager = {
		
		/**
		 * 事件管理器管理的所有事件
		 * @property 
		 * */
		events : {},
		
		/**
		 * 事件管理器对应事件的处理程序
		 * @property
		 * */
		handlers : {},
		
		/**
		 * 绑定事件
		 * @param {String} event 事件代码
		 * @param {Function} handler 处理程序
		 * @param {Object} scope 函数执行域
		 * */
		bind : function(event,handler,scope){
			var events = event;
			if(typeof events == 'string'){
				if(!this.events[event]){
					this.events[event] = true;
					this.handlers[event] = [];
				}
				handler = { fn : handler,
							scope : scope 
						};
				this.handlers[event].push(handler);
				//绑定数组
			}else if(Object.prototype.toString.call(events)  == '[object Array]'){
				for(var i = 0;i < events.length;i++){
					event = events[i];
					if(!this.events[event]){
						this.events[event] = true;
						this.handlers[event] = [];
					}
					this.handlers[event].push({ 
							fn : handler,
							scope : scope 
						});
				}
			}
		},
		
		/**
		 * HteOS.EventManager.bind
		 * */
		on : function(event,handler,scope){
			this.bind.call(this,event,handler,scope);
		},
		
		/**
		 * 触发事件
		 * @param {String} event 事件代码
		 * */
		trigger : function(event){
			var handlers = this.handlers[event];
			var args = Array.prototype.slice.call(arguments,1);
			//HteOS.Console.debug("trigger event : " + event + ", args :" + args);
			if(!handlers || handlers.length <= 0){
				return ;
			}
			var c = arguments.callee.caller;
			for(var i = 0 ;i < handlers.length;i++){
				handler = handlers[i];
				HteOS.Console.debug("event hanlder execute: " + event + ", fn :" + handler.fn.name + ",scope:" + (handler.scope || null),c); 
				var result = handler.fn.apply(handler.scope || null,args);
			}
		},
		
		/**
		 * 取消绑定事件的处理程序
		 * @param {String} event 事件代码
		 * @param {Function} handler 处理程序
		 * */
		unbind :function(event,handler){
			var handlers = this.handlers[event];
			if(handlers.length <= 0){
				return ;
			}
			var index = handlers.indexOf(handler);
			if(index < 0){
				return ;
			}
			handlers.slice(index + 1,1);
		},
		
		/**
		 * 删除事件
		 * @param {String} event 事件代码
		 * */
		remove : function(event){
			delete this.events[event];
			delete this.handlers[event];
		}
	}
}));